import java.util.*;
/**
 * 
 * 滑动窗口的最大值
 * 
 * 描述

给定一个长度为 n 的数组 num 和滑动窗口的大小 size ，找出所有滑动窗口里数值的最大值。

例如，如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3，那么一共存在6个滑动窗口，他们的最大值分别为{4,4,6,6,6,5}； 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个： {[2,3,4],2,6,2,5,1}， {2,[3,4,2],6,2,5,1}， {2,3,[4,2,6],2,5,1}， {2,3,4,[2,6,2],5,1}， {2,3,4,2,[6,2,5],1}， {2,3,4,2,6,[2,5,1]}。

窗口大于数组长度或窗口长度为0的时候，返回空。

数据范围： 
1
≤
n
≤
10000
1≤n≤10000，
0
≤
s
i
z
e
≤
10000
0≤size≤10000，数组中每个元素的值满足 
∣
v
a
l
∣
≤
10000
∣val∣≤10000
要求：空间复杂度 
O
(
n
)
O(n)，时间复杂度 
O
(
n
)
O(n)

 */
public class 滑动窗口的最大值 {
    
    public static void main(String[] args) {
        
        int[] nums = new int[]{2,3,4,2,6,2,5,1};

        List<Integer> result = maxInWindows(nums, 3);

        result.stream().map(s -> s+", ").forEach(System.out::print);
        System.out.println();

    }

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @param size int整型 
     * @return int整型ArrayList
     */
    public static ArrayList<Integer> maxInWindows (int[] num, int size) {
        // write code here

        ArrayList<Integer> list = new ArrayList<>();

        if(size == num.length){

            int max = Arrays.stream(num).max().getAsInt();
            
            list.add(max);
        } else if(size == 0 || size > num.length){

            return list;
        } else {

            for(int i=0; i<=num.length-size; i++){

                int[] sub = new int[size];

                System.arraycopy(num, i, sub, 0, size);

                int max = Arrays.stream(sub).max().getAsInt();

                list.add(max);
            }

        }

        return list;
    }
}
